﻿#include <learn/ais/ais_context.h>
#include <learn/painter/paint_ctx.h>
#include <learn/painter/renderer.h>

using namespace xi;
using namespace xi::painter;

Renderer::Renderer(Paint_Context *ctx) : AIS_Renderer(), m_ctx(ctx)
{
    // 不用删除数组，由于 vao 内部是智能指针，会自动删除
    m_ctx->gen_array(m_id);
}

void Renderer::draw(AIS_Object *obj) const
{
    // 向着色器传递数据
    // auto shader = m_ctx->current().shader;
    // shader->set_value("model", Mat4x4<float>::identity());
    // shader->set_value("view", m_ctx->context()->info()->camera->view());
    // shader->set_value("projection", m_ctx->context()->info()->camera->projection());
    // shader->set_value("viewPos", m_ctx->context()->info()->camera->position());
}

Mesh_Renderer::Mesh_Renderer(Paint_Context *ctx) : Renderer(ctx), diffuseTex(Paint_Context::Green2d)
{
    // 生成着色器
    // m_ctx->gen_shader("mesh", std::make_shared<Shader>());
    // m_data = [this](AIS_Object *obj) -> Mesh_Data {
    //     AIS_Mesh *castObj = static_cast<AIS_Mesh *>(obj);
    //     auto samples = castObj->mesh();
    //     this->m_count = samples->indices.size(); // 注意记录顶点数
    //     return samples;
    // };
}

void Mesh_Renderer::update(AIS_Object *obj)
{
    // m_ctx->bind_array(m_id);

    // // 创建空的缓冲
    // auto samples = m_data(obj);
    // auto n = samples->vertices.size();

    // // 载入顶点和索引数据
    // auto current = m_ctx->current();
    // auto vbo = current.vbo;
    // vbo->buffer.resize(n * (sizeof(Vec3f) * 2 + sizeof(Vec2f)));
    // std::memcpy(vbo->buffer.data(), samples->vertices.data(), n * sizeof(Vec3f));
    // std::memcpy(vbo->buffer.data() + n * sizeof(Vec3f), samples->normals.data(), n * sizeof(Vec3f));
    // std::memcpy(vbo->buffer.data() + 2 * n * sizeof(Vec3f), samples->texcoords.data(), n * sizeof(Vec2f));

    // current.ebo->buffer.resize(samples->indices.size() * sizeof(unsigned int));
    // std::memcpy(current.ebo->buffer.data(), samples->indices.data(), samples->indices.size() * sizeof(unsigned int));

    // // 记录步长和指针
    // auto vao = current.vao;
    // vao->layout.clear();
    // vao->layout["position"] = std::make_tuple(3, vbo->buffer.data());
    // vao->layout["normal"] = std::make_tuple(3, vbo->buffer.data() + n * sizeof(Vec3f));
    // vao->layout["texcoord"] = std::make_tuple(2, vbo->buffer.data() + 2 * n * sizeof(Vec3f));

    // m_ctx->unbind_array();
}

void Mesh_Renderer::draw(AIS_Object *obj) const
{
    // m_ctx->bind_shader("mesh");

    // // 传入变换矩阵
    // Renderer::draw(obj);

    // // 纹理贴图
    // auto shader = m_ctx->current().shader;
    // shader->set_value("diffuse", diffuseTex);
    // shader->set_value("specular", specularTex);

    // // 开始绘制
    // m_ctx->bind_array(m_id);
    // shader->draw_elements(shader->Triangle, m_count);
    // m_ctx->unbind_array();
}